package org.spring.aop.framework;

import org.spring.aop.Advised;
import org.spring.aop.AdvisedSupport;
import org.tool.TipException;

/**
 * 由能够基于 {@link AdvisedSupport} 配置对象创建 AOP 代理的工厂实现的接口。
 * <p>
 * 代理人应遵守以下合同：
 * <ul>
 * <li>他们应该实现配置指示应该被代理的所有接口。
 * <li>他们应该实现 {@link Advised} 接口。
 * <li>他们应该实现 equals 方法来比较代理接口、建议和目标。
 * <li>如果所有顾问和目标都是可序列化的，它们应该是可序列化的。
 * <li>如果顾问和目标是线程安全的，它们应该是线程安全的。
 * </ul>
 * <p>
 * 代理可能允许也可能不允许更改建议。如果他们不允许更改建议（例如，因为配置被冻结），代理应该在尝试更改建议时抛出 {@link TipException}。
 *
 * @author 李坤
 * @date 2022/4/18 17:30
 */
public interface AopProxyFactory {

    /**
     * 为给定的 AOP 配置创建一个 {@link AopProxy}。
     *
     * @param advised AdvisedSupport 对象形式的 AOP 配置
     *
     * @return 对应的 AOP 代理
     *
     * @throws TipException 如果配置无效
     */
    AopProxy createAopProxy(AdvisedSupport advised) throws TipException;

}
